package com.jqk.cloudzuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.SneakyThrows;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import java.net.URI;
import java.util.Map;

/**
 * @Author:JiangQiKun
 * @Date:2022/03/12 08:44 PM
 * Description:
 * com.jqk.cloudzuulRibbonFilter
 *
 * 需求：将前端请求的 url 进行转化成其他的 url
 * 步骤：
 * 1：准备 router 过滤器
 * 2：接收请求过来的 url
 * 3：将 url 和要转发的目的地url 映射
 * 4：网关本来就有转发的功能。设置 RequestContext 中的 serviceId,url
 */
@Component
public class RibbonFilter extends ZuulFilter {

    /**
     * 过滤器类型
     */
    @Override
    public String filterType() {
        return FilterConstants.ROUTE_TYPE;
    }

    /**
     * 优先级，数字越小，越先执行
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否执行此过滤器
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器的业务逻辑
     */
    @SneakyThrows
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        String url = ctx.getRequest().getRequestURI();
        Map<String,String> forwardMap =  getForwardMap(url);
        if(forwardMap != null){
            String fowardUrl = forwardMap.get(url);
            String serviceId = getServiceId(fowardUrl);
            // ps：如果用的到不是 eureka,不需要设置 serviceId
            String requestUrl = getRequestUrl(fowardUrl,serviceId);
            //1.设置目标service的Controller的路径
            ctx.put(FilterConstants.REQUEST_URI_KEY,requestUrl);
            //2.设置目标service的serviceId
            ctx.put(FilterConstants.SERVICE_ID_KEY,serviceId);
        }
        return null;
    }

    private String getServiceId(String url){
        if(url.startsWith("/")){
            String temp = url.substring(1);
            return temp.split("/")[0];
        }else{
            return null;
        }
    }

    private String getRequestUrl(String url,String serviceId){
        return url.substring(serviceId.length() +1);
    }

    private Map<String,String> getForwardMap(String originalUrl){
        //todo:这里是返回一个map，传入一个originUrl,返回一个要转发的url
        return  null;
    }


}
